////////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENT_NETWORK_H_
#define _CLIENT_NETWORK_H_

////////////////////////////////////////////////////////////////////////////////

#include <queue>
#include <vector>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;


////////////////////////////////////////////////////////////////////////////////

#include "network_packets.h"

////////////////////////////////////////////////////////////////////////////////

class Client;


/** Game client network manager
*
*   Based on Boost.Asio cross-platform C++ library
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jun 22th, 2009
*/
class ClientNetwork
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ClientNetwork( const std::string& _port,
                   Client* _client,
                   boost::asio::io_service& _io_service );


    /** Destructor */
    virtual ~ClientNetwork();


////////////////////////////////////////////////////////////////////////////////


    /** Sends data to server */
    void Send( const ClientPacket& _packet );


    
////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Receives data from server */
    void Receive();


    /** Receive handler */
    void HandleReceive( const boost::system::error_code& _error,
                        size_t _bytesReceived );


    /** Starts sending data to server */
    void StartSend();


    /** Send handler */
    void HandleSend( const boost::system::error_code& _error,
                     size_t _bytesReceived );


    /** Creates connection */
    bool Connect( const std::string& _serverAddr, const std::string& _port );


    /** Queue for sending to server */
    ClientPackets m_SendQueue;

    
    /** Boost IO service */
    boost::asio::io_service& m_io_service;


    /** Socket */
    tcp::socket m_Socket;


    /** Receive buffer size */
    enum
    {
        BUFFER_SIZE = 512
    };

    /** Receive buffer */
    boost::array<char, BUFFER_SIZE> m_RecvBuffer;


    /** Send buffer */
    std::vector<char> m_SendBuffer;


    /** Client interface */
    Client* m_Client;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

